
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package doghost.controllers;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.RollbackException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import doghost.DoghostApp;
import doghost.editors.ItemDeHospedagemEditor;
import doghost.entities.Hospedagem;
import doghost.entities.ItemDeHospedagem;
import doghost.utils.CustomUserDialog;

/**
 *
 * @author duo
 */
public class ItemDeHospedagemController {
    protected ItemDeHospedagem itemDeHospedagem;
    protected Hospedagem hospedagem;
    protected boolean operationOk;

    public ItemDeHospedagem getItemDeHospedagem() {
        return itemDeHospedagem;
    }

    public void setItemDeHospedagem(ItemDeHospedagem itemDeHospedagem) {
        this.itemDeHospedagem = itemDeHospedagem;
    }

    /**
     * Get the value of hospedagem
     *
     * @return the value of hospedagem
     */
    public Hospedagem getHospedagem() {
        return hospedagem;
    }

    /**
     * Set the value of hospedagem
     *
     * @param hospedagem new value of hospedagem
     */
    public void setHospedagem(Hospedagem hospedagem) {
        this.hospedagem = hospedagem;
    }

    /**
     * Get the value of operationOk
     *
     * @return the value of operationOk
     */
    public boolean isOperationOk() {
        return operationOk;
    }

    /**
     * Set the value of operationOk
     *
     * @param operationOk new value of operationOk
     */
    public void setOperationOk(boolean operationOk) {
        this.operationOk = operationOk;
    }

    public void newItemDeHospedagem(EntityManager entityManager, List list) {
        // create a transient object
        this.setOperationOk(false);
        if(this.getHospedagem() == null) {
            CustomUserDialog.erro("Tentativa de criar um item de hospedagem para uma hospedagem inválida!");
            return;
        }
        setItemDeHospedagem(new ItemDeHospedagem());
        this.getItemDeHospedagem().setHospedagem(this.getHospedagem());
        JFrame mainFrame = DoghostApp.getApplication().getMainFrame();
        ItemDeHospedagemEditor itemDeHospedagemEditor = new ItemDeHospedagemEditor(mainFrame, true);
        itemDeHospedagemEditor.setLocationRelativeTo(mainFrame);
        itemDeHospedagemEditor.setCurrentRecord(getItemDeHospedagem());
        itemDeHospedagemEditor.setVisible(true);
        if (itemDeHospedagemEditor.isSaveFired()) {
            try {
                entityManager.getTransaction().begin();
                entityManager.persist(getItemDeHospedagem());
                entityManager.getTransaction().commit();
                this.setOperationOk(true);
                if(list != null) {
                    list.add(getItemDeHospedagem());
                }
                Logger.getLogger(this.getClass().getName()).
                        log(Level.INFO, "ItemDeHospedagem adicionado(a) com sucesso: " +
                        getItemDeHospedagem());
            }
            catch (Exception e) {
                Logger.getLogger(this.getClass().getName()).
                        log(Level.SEVERE, "Erro adicionando ItemDeHospedagem: " + e);
            }
        }
    }

    public void newWOPersistItemDeHospedagem() {
        // create a transient object
        this.setOperationOk(false);
        if(this.getHospedagem() == null) {
            CustomUserDialog.erro("Tentativa de criar um item de hospedagem para uma hospedagem inválida!");
            return;
        }
        this.getItemDeHospedagem().setHospedagem(this.getHospedagem());
        JFrame mainFrame = DoghostApp.getApplication().getMainFrame();
        ItemDeHospedagemEditor itemDeHospedagemEditor = new ItemDeHospedagemEditor(mainFrame, true);
        itemDeHospedagemEditor.setLocationRelativeTo(mainFrame);
        itemDeHospedagemEditor.setCurrentRecord(getItemDeHospedagem());
        itemDeHospedagemEditor.setVisible(true);
        if (itemDeHospedagemEditor.isSaveFired()) {
            this.setOperationOk(true);
            Logger.getLogger(this.getClass().getName()).
                        log(Level.INFO, "ItemDeHospedagem sem persistencia adicionado(a) com sucesso: " +
                        getItemDeHospedagem());
        }
    }

    public void editItemDeHospedagem(EntityManager entityManager, List list, int index) {
        this.setOperationOk(false);
        entityManager.getTransaction().begin();
        JFrame mainFrame = DoghostApp.getApplication().getMainFrame();
        ItemDeHospedagemEditor itemDeHospedagemEditor = new ItemDeHospedagemEditor(mainFrame, true);
        itemDeHospedagemEditor.setLocationRelativeTo(mainFrame);
        itemDeHospedagemEditor.setCurrentRecord(getItemDeHospedagem());
        itemDeHospedagemEditor.setVisible(true);
        if (itemDeHospedagemEditor.isSaveFired()) {
            try {
                entityManager.merge(getItemDeHospedagem());
                entityManager.getTransaction().commit();
                this.setOperationOk(true);
                Logger.getLogger(this.getClass().getName()).
                    log(Level.INFO, "ItemDeHospedagem Editado(a) com sucesso: " +
                    getItemDeHospedagem());
            } catch (RollbackException rex) {
                // refresh itemDeHospedagem in list
                Logger.getLogger(this.getClass().getName()).
                    log(Level.SEVERE, "ItemDeHospedagem erro de edição (rollback) : " +
                    rex);
                ItemDeHospedagem originalItemDeHospedagem = (ItemDeHospedagem)
                        entityManager.find(getItemDeHospedagem().getClass(),
                        getItemDeHospedagem().getId());
                if(list != null) {
                    list.remove(getItemDeHospedagem());
                    list.add(index, originalItemDeHospedagem);
                }
            } catch (Exception e) {
                Logger.getLogger(this.getClass().getName()).
                        log(Level.SEVERE, "ItemDeHospedagem erro de edição: " + e);
                if (entityManager.getTransaction().isActive()) {
                    try {
                        entityManager.getTransaction().rollback();
                    } catch (Exception erb) {
                        Logger.getLogger(this.getClass().getName()).
                                log(Level.SEVERE, "Erro abandonando edição de itemDeHospedagem, " +
                                "transação ativa: " + erb);
                    }
                }
            }
        } else {
            try {
                if (entityManager.getTransaction().isActive()) {
                    entityManager.refresh(getItemDeHospedagem());
                    entityManager.getTransaction().commit();
                }
                // refresh itemDeHospedagem in list
                ItemDeHospedagem originalItemDeHospedagem = (ItemDeHospedagem)
                        entityManager.find(getItemDeHospedagem().getClass(),
                        getItemDeHospedagem().getId());
                if(list != null) {
                    list.remove(getItemDeHospedagem());
                    list.add(index, originalItemDeHospedagem);
                }
                Logger.getLogger(this.getClass().getName()).
                    log(Level.INFO, " Edição de ItemDeHospedagem cancelada com sucesso " +
                    "itemDeHospedagem: " + getItemDeHospedagem());
            } catch (RollbackException rex) {
                Logger.getLogger(this.getClass().getName()).
                    log(Level.SEVERE, "Erro cancelando edição de itemDeHospedagem " +
                    "(rollback) : " + rex);
                if (entityManager.getTransaction().isActive()) {
                    try {
                        entityManager.getTransaction().rollback();
                    } catch (Exception erb) {
                        Logger.getLogger(this.getClass().getName()).
                                log(Level.SEVERE, "Erro abandonando eliminação de itemDeHospedagem. " +
                                "transação ativa: " + erb);
                    }
                }
            }
        }
    }

    public void editWOPersistItemDeHospedagem() {
        this.setOperationOk(false);
        JFrame mainFrame = DoghostApp.getApplication().getMainFrame();
        ItemDeHospedagemEditor itemDeHospedagemEditor = new ItemDeHospedagemEditor(mainFrame, true);
        itemDeHospedagemEditor.setLocationRelativeTo(mainFrame);
        itemDeHospedagemEditor.setCurrentRecord(getItemDeHospedagem());
        itemDeHospedagemEditor.setVisible(true);
        if (itemDeHospedagemEditor.isSaveFired()) {
                this.setOperationOk(true);
                Logger.getLogger(this.getClass().getName()).
                    log(Level.INFO, "ItemDeHospedagem sem persistencia Editado(a) com sucesso: " +
                    getItemDeHospedagem());
        } else {
                Logger.getLogger(this.getClass().getName()).
                    log(Level.INFO, " Edição de ItemDeHospedagem sem persistencia cancelada com sucesso " +
                    "itemDeHospedagem: " + getItemDeHospedagem());
        }
    }

    public void deleteItemDeHospedagem(EntityManager entityManager, List list, int index) {
        this.setOperationOk(false);
        Object[] options = {"Sim", "Não"};
        int n = JOptionPane.showOptionDialog(null, "Remove a linha ?", "Aviso",
                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, null);
        if (n ==JOptionPane.YES_OPTION) {
            try {
                entityManager.getTransaction().begin();
                entityManager.remove(getItemDeHospedagem());
                entityManager.getTransaction().commit();
                this.setOperationOk(true);
                if(list != null) {
                    list.remove(getItemDeHospedagem());
                }
            } catch (Exception e) {
                Logger.getLogger(this.getClass().getName()).
                    log(Level.SEVERE, "Erro eliminando itemDeHospedagem: " + e);
            }
        }
    }

    public void deleteWOPersistItemDeHospedagem() {
        this.setOperationOk(false);
        Object[] options = {"Sim", "Não"};
        int n = JOptionPane.showOptionDialog(null, "Remove a linha ?", "Aviso",
                JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, null);
        if (n ==JOptionPane.YES_OPTION) {
            this.setOperationOk(true);
        }
    }
}

